一個環境變數是一個鍵值對,看起來像這樣:
KEY=VALUE
在主機裡的所有程式使用環境變數分享設定值,環境變數的例子:
設定預設的修改者,告訴 ruby 哪裡去找 gems (GEM_PATH / GEM_HOME)、傳送 API keys 到應用程式而且不要 commit 到版控系統、定義操作系統要從哪裡尋找二元檔案(Windows 的 .exe 檔)、讓 Rails 從測試/開發/產品模式下開始執行
可以發現一堆的環境變數 & env 指令在 Linux / Mac 裡 & set 指令在 Windows 裡,例子:
PWD=/home/jesus
SHELL=/usr/bin/zsh
RUBY_ENGINE=ruby
RUBY_VERSION=2.6.0
GEM_ROOT=/opt/rubies/ruby-2.6.0/lib/ruby/gems/2.6.0
# ...
這份環境變數的名單可以非常的長,但是並不需要去死記。可以印出所有的 gem-specific 變數 & gem env 的指令設定。如果想要從 ruby 存取這些環境變數,有一個特別的物件可以使用。
Ruby 有 ENV 物件看起來像是一個 hash,這個物件可以讓使用者存取所有可以讓使用者操作的環境變數。例如可以看有多少的 key:
ENV.size
# 48
拿到 key 的名單:
ENV.keys
存取特定的 key:
ENV["GEM_HOME"]
# "/home/jesus/.gem/ruby/2.6.0"
甚至可以使用像是 map & select 方法:
ENV.select { |k,v| k.size < 4 }
但是如何在 ruby 外設定環境變數?
可以設定一次性的環境變數,像是:
API_KEY=1 ruby -e 'p ENV["API_KEY"]'
在終端機使用、 irb 之外, ruby 可以存取這個 API_KEY 的值,也可以在 rails 模式做到。舉個例子:
RAILS_ENV=production rails console
如果輸入 API_KEY=1 ...這個環境變數只會被這個指令呼叫,如果要設定從現在的終端機的其他指令也可以呼叫:
export API_KEY=1
Now if you do:
ruby -e 'p ENV["API_KEY"]'
這樣會得到 1,而且沒有前綴變數。另外,不要在 ruby 裡使用 ENV 設定, ENV 是用來讀取從 ruby 之外額外的設定。